第三方支付账务系统论述
以下文章来源于小代嘚吧嘚 ,作者文远
这篇文章来自文远的分享,笔者从事多年银行账务系统的设计与研发,三年前进入互联网行业,进行第三方支付账务系统的设计,一路走来,感触良多。
关于第三方支付账务系统如何建设、与银行核心账务系统的区别与联系、与公司大财务系统如何对接,在本文中会具体论述。
小编拜读之后收获颇多,分享给大家,发现很多小伙伴都很关注这块内容,期待一起深挖这块内容,希望大家能够喜欢。
第三方支付账务系统设计
首先谈一下支付公司账务系统如何设计。关于如何记账,国内长期以来有两个发展方向,一个是以金蝶、用友为代表的财务系统,另一个是以银行为代表的银行账务核心系统。
这两种账务系统都是用来记账,但设计理念上有很大差别,财务系统以科目为中心,记账必谈科目,银行账务系统以账户为中心,记账必谈账户。从账户数量来讲,支付公司几千万甚至上亿的账户数量,金蝶、用友这种财务系统是支撑不起来的。基本上,对于支付公司的账务系统应该参考银行账务核心系统来设计,这一点在业界已经达成共识。
这里谈的的账务系统,是说的复式记账(有借有贷,借贷相等),但是不采用复式记账,而是采用单式记账,是否可以呢?首先说答案,是可以的。但是,单式记账不科学,也存在一些缺陷。采用单式记账,存在以下一些问题:
1. 资金的来龙去脉不清晰。记账是一门技术,有专门的方法,从刻字记事、结绳记事,发展到现在,借贷复式记账是目前为止最科学的一种记账方法。借贷复式记账能够清楚记录每笔资金从哪来、到哪去,这一点,单式记账是无法做到的。
2. 单式记账无法进行资产、负债平衡检查。资金不会凭空而来,也不会凭空而去。对于一个会计主体,有多少资产,就有多少负债,资产 = 负债 (所有者权益是对股东的负债)。
比如用户充值业务,在支付机构的账务体系中,采用复式记账,用户余额增加,同时支付机构在银行的存款科目余额增加,日终进行总账平衡检查,银行存款科目余额 = 用户余额 (不考虑支付手续费)。而如果采用单式记账,一笔充值业务,只记录用户余额增加,而不记录银行存款,那么,用户的余额是否等于支付机构的银行存款呢?采用单式记账,是没有办法进行这种平衡检查的。
3. 从业务模型来讲,也需要复式记账。还用上面的例子来讲,比如,支付公司对接了100家银行,用户在每家银行都有充值,如果每笔充值,只记录用户余额是多少,而不记录支付公司在银行的存款是多少,那该如何核对支付公司在每个银行有多少余额呢?只能是把所有用户余额汇总在一起,然后把所有的银行对账单的余额汇总在一起,核对一个总数。
这种核对方法,由于时间差或各种原因,是很难核对出具体每个银行账户存款的差异的。而如果采用复式记账,对于每笔充值,都记录了对应银行存款科目余额(或者是应收账款科目)的变化,账务系统总账借贷平衡之后,再用银行存款科目余额与银行对账单核对,就很容易核对出对应银行端每个账户余额差异了。
在日常财务处理的工作中,财务人员也是用银行存款科目余额与银行对账单来核对,出具余额调节表,来核对与银行对账单的差异。所以说,从现实业务模型来讲,支付账务系统也应该采用复式记账的方法来进行记账。
以上谈了两点:
一、支付公司的账务系统参考银行的账务系统来设计。二、采用复式记账。那么,账务系统具体如何设计呢?
(1)账务核心四张表
从数据的角度来看,账务系统与其他系统没什么区别,存储的也是数据,只不过存储的是和账务相关的数据,按会计科目分类存储。账务核心主要有四张表:分录流水、分户账、明细账、总账。
1.分录流水是记账的凭证,记录每笔资金活动的来龙去脉,具体业务要素包括:
机构码
币种
交易码
交易日期
账务流水号
分录序号
帐号
借贷标志
科目号
发生额
......
2.分户账 记录账户的余额,可以有用户分户账、商户分户账、贷款分户账、内部分户账等,具体业务要素包括:
机构码
币种
客户号
帐号
账户类型
余额
上日余额
科目号
......
3.明细账 记录每个账户对应余额的变化,具体的业务要素包括:
帐号
交易日期
明细序号
发生额
借贷标志
科目号
余额
账户流水号
对方帐号
对方帐户名称
......
4.总账 科目总账,分为日总账和周期总账,日总账每日生成,周期总账月末、季末、半年末、年末生成,记录每个科目的期末余额和本期借、贷发生额。具体业务要素包括:
账期
机构码
币种
科目号
上期借方余额
上期贷方余额
本期借方发生额
本期贷方发生额
期末借方余额
期末贷方余额
......
当一笔业务发生时,首先生成分录流水,然后驱动账户余额变化,账户余额变化后,生成明细账。日终根据分录流水生成总账。根据业务需要,也可以先修改账户余额,然后异步生成分录流水,但是无论先生成会计分录,还是缓冲异步生成会计分录,都要保证分录流水与分户账余额的一致性,这一点通过日终系统的检查来保证。
(2)日间和日终
账务系统从模块上划分为两大系统,日间和日终。日间,业务驱动账务完成业务记账,账务系统根据不同的业务场景,划分不同的交易码,设置分录规则,拆分录、改余额。日终,进行平衡检查,保证账务系统数据的一致与准确,生成总账。日终主要进行如下处理。
1.自动入账。对于已拆分录未改余额的订单,改余额、记明细,对于已改余额未拆分录的订单,记分录流水。
2.生成总账。根据分录流水生成科目总账,科目发生额和余额从末级科目逐级汇总到一级科目。
3.总账平衡检查。
发生额平衡检查:一级科目借方发生额 = 一级科目贷方发生额
余额平衡检查:一级借方科目余额 = 一级贷方科目余额
4.总分核对。总账科目余额 = 分户账科目余额汇总。因为业务24小时不间断运行,分户账余额在不断变化,无法准确取到期末的账户余额进行核对。这可以考虑用余额快照与总账科目余额进行核对。
5.稽核明细。检查明细账与分录流水是否一致。对于当日发生过余额变动的账户,昨日余额与分录流水中的发生额进行轧差,检查计算出的余额与余额快照是否一致。
(3)多机构、多币种。
在分录流水、分户账、明细账中都设置机构码和币种字段,对于每套分录,同一机构、同一币种的借贷发生额是相符的。生成总账时,根据不同的机构、不同的币种生成总账,每个机构内,同一币种的总账借贷平衡。在同一机构,如果一套分录中涉及多个币种,用货币兑换科目来轧平,期末通过货币兑换科目来计算和结转货币兑换损益。每个币种一套总账,根据期末汇率,外币折算为本币,生成合并后的总账。
(4)对账。
账务系统的数据要保证清晰、准确、完整。清晰通过会计分录来实现,通过分录流水,知道是什么业务场景,知道资金是怎么流转的。而准确和完整,是要通过对账来保证的。对账核对的是账务数据的完整性与准确性,是账务系统的一部分。
互联网IT各系统分布部署,每个系统中都存放了一些业务数据,但只要和资金相关的数据都集中存放到了账务系统中。也就是说各业务系统分布部署,账务系统数据集中。通过日终检查,已经保证了账务系统内部数据的一致性,然后支付公司内部各其他系统与账务系统进行对账,保证支付公司各系统之间的数据一致性。内部对账一致后,账务系统再与外部进行对账,保证账务数据与外部系统数据的一致。与外部系统进行核对,包括与银行对账单核对,也包括提供账单给商户,商户根据账务系统提供的账单进行核对。
因为内部对账已经保证了账务系统数据与内部业务系统数据的一致,与外部对账,用业务系统的数据与外部进行核对也是可以的,但业务系统与外部核对,一般只能核对发生额,对于余额是无法进行核对的。而如果用账务系统来核对,既可以核对发生额,也可以核对余额。
对于银行存款,可以用银行存款的明细账与银行对账单核对,对于应付商户款,可以提供商户账户的明细给商户进行核对。另外,在实际工作中,会有各种各样的调账处理,而这些调账处理,可能并不在业务系统中体现,所以,外部对账,还是推荐直接用账务系统与银行、与客户进行核对。
账务系统的作用与目标
对于账务系统,前文提到包括分录流水、分户账、明细账、总账。这是一个整体,这四张表要保证数据完全一致。在银行核心账务系统中,一般都是先生成分录流水,然后分录流水驱动账务余额变化和生成明细账。在支付公司的账务系统建设中,为了快速响应业务,把账务系统分成了两个部分,账户系统与会计系统,账户系统是指分户账与明细账,会计系统是指分录流水和总账。
这样的划分是可以的,但这样划分并不代表账户与会计是独立没有联系的,二者仍然是一个整体。账户中有科目,分录中有帐号,总分平衡、借贷平衡,完整的组成一套账务体系。试想,如果没有这套账务体系的设计,在账户系统中只记录帐号和余额,这些帐号和余额在其他系统中也是可以记录的,那么,为什么还需要建设一套账务系统呢?
账户中有科目,是为了总分核对,明细中有流水号,是为了明细能对应到分录流水,有分录流水,是为了账目清晰,能清楚的体现每笔资金的来龙去脉,根据分录流水生成总账,是为了掌握资产和负债的情况,而总账是否准确,又要总账和分户账进行总分核对。账务体系这样设计,就是为了达到两个目的:
(1)清晰。
(2)准确。
而账务系统建设的最终目标是是什么呢?最终目标是提供财务报表。
账务系统有以下几个作用:
1. 提供业务支撑。记录余额的变化,保证业务正常运转。业务驱动账务,没有业务也就没有账务,账务要保证业务能正常运转,账务的余额要100%准确。
2. 为用户提供账单。用户数量太多,不会为每个用户发送账单,用户可以查询账户的余额和明细。
3. 为商户提供账单。商户对于开在支付公司的账户与在银行的对公账户是同等看待的,账务系统需要为商户提供资金对账单。
4. 内部核算。记录银行存款、应收账款、手续费、利息收入等科目余额,与银行或第三方提供的账单进行核对,核对余额与发生额。
5. 为企业大财务提供汇总记账凭证。支付公司的账务系统记录的是业务账,这些数据是整个企业财务数据的一部分,需要合并到公司的大财务系统中去。可以把支付账务系统的会计分录映射为大财务的分录,然后汇总,直接对接企业ERP总账。这一点与银行非常类似,银行账务核心记录的是存款、贷款、汇款这些业务数据,这些业务账也是要与银行财务系统合并到一起的。
账务系统建设中遇到的一些问题
从银行账务系统到第三方支付账务系统,在实施过程中还是会遇到各种各样的问题。银行账务系统已经实施了二十多年,在这二十多年里,也培养了许多熟悉银行会计与银行业务的核心人员。
而互联网行业,很多开发同学对于会计不了解,对于账务系统如何做,也没有概念,而要建设这样一套复杂的账务体系,没有一批熟悉会计、熟悉业务的人员是很难做到的。所以,在实施过程中,要有准备,把这套体系给大家讲清楚,需要花费一定的时间和精力。
另外,在账务实施过程中,因为业务驱动账务,账务反映的是业务活动,所以需要了解清楚具体的业务场景,才能知道该如何记账、该如何拆分录,在这个过程中,需要和业务人员、财务人员持续的保持沟通,把业务梳理清楚。
还有,在银行账务系统中,账务核心一般对接大前置就可以,而互联网公司有很多系统,账务系统可能会与不同的系统对接,要准确了解个各系统之间的调用关系,把记账流程规划清楚。
与银行账务系统的区别与联系
总体来说,支付公司的账务系统是可以参考银行账务系统来设计的,但是在实施过程中还是会有一些区别。
1. 分库分表。银行账务核心一般采用的小型机,数据库采用ORACLE 或DB2,支付公司一般采用服务器,数据库用Mysql。从机器性能和数据库性能来讲,银行系统的性能会更高一些,所以银行账务系统目前基本上还没有使用分库分表的策略,而互联网公司对于一些库表已经进行分库和分表处理了。
2. 24小时记账。在银行账务系统中,对于24小时运行,有很多种方案,例如切换余额、记不同分户账、日切后补流水等,但无论哪种方案,都不能实现完全24小时运行,少则几分钟,多则半个小时以上的时间,系统是不能对外运行的。
其问题,主要是因为日终要进行总分核对,而分户账余额是在不断变化的,所以要想办法把期末的分户账余额取出来进行核对。这个我在日终系统中提到过,可以采用余额快照与总账进行核对,这样即使分户账余额进行变化,也不影响总分核对。
余额快照是根据明细生成的,这种用余额快照与总账进行核对的方法进行其实存在一个问题,余额快照可能与真正的分户账期末余额不一致。这一点可以通过技术方法处理掉,在分户账中增加上日余额字段,每日增加一个定时任务,进行快照与上日余额的核对。
3. 银行存款余额调节表。第三方支付公司与商业银行核对银行存款,商业银行也会与人民银行核对头寸。商业银行每日都要与人民银行进行头寸核对,对于头寸的变动,有大额支付系统、小额支付系统、超级网银、同城等业务。
这些业务,人民银行都会回传一个对账日期,而银行账务系统一般都会把这个对账日期记下来,这样用人行的对账日期来核对,基本上每天都是可以对平的。
而对于企业,会在很多商业银行开户,每个银行的记账日期也不一致,这就需要企业根据银行存款科目日记账与银行对账单进行核对,为每个银行账户出具余额调节表。
与公司大财务系统的对接
支付公司的账务系统记录的支付业务账,属于整个公司财务系统数据的一部分,这部分数据需要对接到公司大财务的ERP系统中,实现业务财务一体化。支付业务账与公司大财务系统对接,有以下几种方法:
1. 把支付各系统的业务订单报送大财务,大财务根据业务订单,分析是什么业务场景,进行拆分录处理。这种处理方式,因为各业务系统的订单分散在各个表中,数据格式也不统一,而且随着订单状态的变更,业务状态在发生变化,需要把每个业务状态反映到大财务系统中去,这个复杂度是很高的。
2. 大财务直接根据银行对账单来记账。银行对账单只能告知企业在银行实际有多少资金,并不能体现企业在银行应该有多少资金,所以只根据银行对账单来记账不够科学。
另外,只根据银行对账单来记账,不能全面反映业务情况,例如对于应付款,有用户充值资金和应付商户结算款,或者应付商户款想再细化到业务线,通过银行对账单来记账是无法实现这种要求的。
3. 支付账务会计分录映射到大财务会计分录,直接对接大财务总账。因为账务系统已经集中了所有和资金相关的数据,并进行了各种平衡检查、内部对账、外部对账,是可以把账务系统数据直接映射为大财务分录,合并到大财务的总账中去的。
这个有一点需要注意,支付账务系统科目设计时,尽量与大财务科目保持一致,对于业务场景,也要与大财务沟通清楚。
总结
随着互联网的发展,第三方支付、互联网金融、电子商务,只要涉及资金、应收、应付、债权、债务、收入、费用,都会有账务系统的建设需要,而对于账务系统如何建设,随着业务的发展与技术的进步,相信会不断的有创新和发展。写此文,共勉。
往期推荐:
技术琐话
以分布式设计、架构、体系思想为基础,兼论研发相关的点点滴滴,不限于代码、质量体系和研发管理。